package com.sugon.modules.tools.service.impl;


import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;
import com.sugon.dao.ToolsCheckTicketItemDao;
import com.sugon.entity.ToolsBaseEntity;
import com.sugon.entity.ToolsCheckJudgeStandardEntity;
import com.sugon.entity.ToolsCheckTicketEntity;
import com.sugon.entity.ToolsCheckTicketItemEntity;
import com.sugon.modules.device.consts.ToolsCheckTicketState;
import com.sugon.modules.tools.service.IToolsCheckTicketManager;
import com.sugon.service.ToolsCheckJudgeStandardService;
import com.sugon.service.ToolsCheckTicketItemService;
import com.sugon.service.ToolsCheckTicketService;
import com.sugon.utils.ShiroUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Optional;

/**
 * 工装周期性检测工单Manager实现类
 *
 * @author YuXD
 * @since 2021-10-10
 */
@Service
public class ToolsCheckTicketManagerImpl implements IToolsCheckTicketManager {

    @Autowired
    private ToolsCheckTicketItemDao toolsCheckTicketItemDao;
    @Autowired
    private ToolsCheckTicketService toolsCheckTicketService;
    @Autowired
    private ToolsCheckTicketItemService toolsCheckTicketItemService;
    @Autowired
    private ToolsCheckJudgeStandardService toolsCheckJudgeStandardService;

    /**
     * getTicketToolsBaseList
     *
     * @param ticketId
     * @return
     */
    @Override
    public List<ToolsBaseEntity> getTicketToolsBaseList(String ticketId) {
        List<ToolsBaseEntity> ticketToolsBaseList = toolsCheckTicketItemDao.getTicketToolsBaseList(ticketId);
        return Optional.ofNullable(ticketToolsBaseList).orElseGet(() -> CollectionUtil.newArrayList());
    }

    /**
     * updateMeasuredValue
     *
     * @param toolsCheckTicketItem 工单明细信息，包含明细ID, 测量值或者更换时间
     * @return
     */
    @Override
    public boolean updateMeasuredValue(ToolsCheckTicketItemEntity toolsCheckTicketItem) {
        // 获取工单明细ID
        String ticketItemId = toolsCheckTicketItem.getId();
        /*
            1、更新工单明细的测量值、验证结果、检测时间、检测人
            2、检测当前工单是否已全部填写完毕，如果填写完毕，修改工单状态
         */
        // 获取工单明细
        ToolsCheckTicketItemEntity ticketItem = toolsCheckTicketItemService.queryObject(ticketItemId);
        Assert.notNull(ticketItem, "工单明细不存在");

        boolean updateFlag = false;
        BigDecimal measuredValue = toolsCheckTicketItem.getMeasuredValue();
        Date changeDate = toolsCheckTicketItem.getChangeDate();
        String checkToolCode = toolsCheckTicketItem.getCheckToolCode();
        if (measuredValue != null) {
            // 获取判定标准
            ToolsCheckJudgeStandardEntity judgeStandard = toolsCheckJudgeStandardService.queryObject(ticketItem.getJudgeStandardId());
            Assert.notNull(judgeStandard, "判定标准不存在");
            // 判定验证结果
            if (NumberUtil.isGreaterOrEqual(measuredValue, judgeStandard.getStartInterval()) && NumberUtil.isLessOrEqual(measuredValue, judgeStandard.getEndInterval())) {
                toolsCheckTicketItem.setValidationResult("OK");
            } else {
                toolsCheckTicketItem.setValidationResult("NG");
            }
            toolsCheckTicketItem.setMeasuredValue(measuredValue);
            toolsCheckTicketItem.setCheckDate(DateUtil.date());
            toolsCheckTicketItem.setChecker(ShiroUtils.getUserId());
            updateFlag = toolsCheckTicketItemService.update(toolsCheckTicketItem) > 0;
        } else if (changeDate != null) {
            toolsCheckTicketItem.setChangeDate(changeDate);
            toolsCheckTicketItem.setConfirmor(ShiroUtils.getUserId());
            updateFlag = toolsCheckTicketItemService.update(toolsCheckTicketItem) > 0;
        } else if (StrUtil.isNotEmpty(checkToolCode)) {
            updateFlag = toolsCheckTicketItemService.update(toolsCheckTicketItem) > 0;
        }
        // 如果保存完毕，需要修正工单状态
        if (updateFlag) {
            checkTicketState(ticketItem.getTicketId());
        }
        return updateFlag;
    }

    /**
     * 矫正工装检测工单状态
     *
     * @param ticketId 工装周期性检测工单ID
     */
    @Override
    public void checkTicketState(String ticketId) {
        ToolsCheckTicketEntity checkTicket = toolsCheckTicketService.queryObject(ticketId);
        Assert.notNull(checkTicket, "工单不存在");
        Integer unHandleTicketItemNum = toolsCheckTicketItemDao.getUnHandleTicketItemNum(ticketId);
        checkTicket.setState(unHandleTicketItemNum > 0 ? ToolsCheckTicketState.ING : ToolsCheckTicketState.ED);
        toolsCheckTicketService.update(checkTicket);
    }
}
